/*! \file ModPerAlb.c
	\brief Modulo Percistencia de Albuns.

As responsabilidades do Modulo Percistencia de Albuns e de gericiar o arquivo responsavel por salvar as estruturas dos Albuns em um arquivo
e gerenciar esses detro do arquivo.\n

Arquivo : o Arquivo sera um arquivo de resgistros de tamanho fixo que tera as sequintes caracteristicas:\n
|campo 1= 1 digitos|campo 2= 11 digitos|campo 3= 10 digitos|campo 4= 15 digito|campo 5= 30 digito|campo 6= 2 digito|\n

campo 1= Nivel de Acesso \n 1 privado
campo 2= chave primaria cpf \n
campo 3= O codigo do album\n
campo 4= O nome do album\n
campo 5= descricao do album\n
campo 6= numero fotos do album\n
 */

#define PerAlb_Serv
#include "InPerAlb.h"



//lista de fun�oes do modulo
int ValidaOperacao_PA (int); //testar , comentar , fazer Interface
int EncontraAlbum_PA (FILE*, const char*, const char*);
int FechaArquivo (FILE*);
//fim

int FechaArquivo (FILE* ArquiTexto)
{
	fclose (ArquiTexto);
	return 0;
}

int EncontraAlbum_PA (FILE* ArquiTexto, const char* CpfPass, const char* CodigPass)//testa / comentar /interface
{
	char CpfPego[12], CodigPego[11];
	int CpfEncon = 0, i = 0, PosicRegis = 0;

	fgetc (ArquiTexto);
	while (!feof (ArquiTexto))
	{
		fgetc (ArquiTexto);
		CpfEncon = 0;

		for (i = 0; i < 11; i++)
		{
			CpfPego[i] = fgetc (ArquiTexto);
		}
		CpfPego[i] = '\0';

		if (strcmp (CpfPego, CpfPass) == 0)
		{
			fseek (ArquiTexto, 1, SEEK_CUR);

			for (i = 0; i < 10; i++)
			{
				CodigPego[i] = fgetc (ArquiTexto);
			}
			CodigPego[i] = '\0';

			if (strcmp (CodigPego, CodigPass) == 0)
			{
				return PosicRegis;
			}
			else
			{
				CpfEncon = 1;
			}
		}

		fseek (ArquiTexto, 63 - CpfEncon * 11, SEEK_CUR);
		fgetc (ArquiTexto);
		PosicRegis++;
	}
	return -1;
}

int ValidaOperacao_PA (int TipoErro) //testar /comentar /Interface
{
	char Exten[] = EXTENSAO_PA, NomeArqui[] = NARQUIVO_PA;
	int Retor = 0;

	if (TipoErro == -1)
	{
		Retor = ReatualizacaoVetBits_VB (NomeArqui, Exten, TAMANHOREG_PA, VARIAVELCONTROLE_PA);
	}

	Retor *= 100;
	return Retor;
}

int PegaAlbum_PA (const char* CpfPass, const char* CodigPass, Album_PA* AlbumPego)//terminar, mudar interface
{
	int i, ValorRegis;
	FILE *Arqui;

	Arqui = fopen (ARQUIVO_PA, "rw");

	if (Arqui == NULL)
	{
		return -1;
	}

	ValorRegis = EncontraAlbum_PA (Arqui, CpfPass, CodigPass);
	if (ValorRegis == -1)
	{
		FechaArquivo (Arqui);
		return -2;
	}

	fseek (Arqui, ValorRegis * (TAMANHOREG_PA + 2), SEEK_SET);

	fscanf (Arqui, "%d", &AlbumPego->Priva);
	fseek (Arqui, 1, SEEK_CUR);

	for (i = 0; i < 11; i++)
	{
		fscanf (Arqui, "%c", &AlbumPego->CpfUser[i]);
	}
	AlbumPego->CpfUser[i] = '\0';
	fseek (Arqui, 1, SEEK_CUR);

	for (i = 0; i < 10; i++)
	{
		fscanf (Arqui, "%c", &AlbumPego->Codig[i]);
	}
	AlbumPego->Codig[i] = '\0';
	fseek (Arqui, 1, SEEK_CUR);

	for (i = 0; i < 15; i++)
	{
		fscanf (Arqui, "%c", &AlbumPego->Nome[i]);
	}
	AlbumPego->Nome[i] = '\0';
	fseek (Arqui, 1, SEEK_CUR);

	for (i = 0; i < 30; i++)
	{
		fscanf (Arqui, "%c", &AlbumPego->Descr[i]);
	}
	AlbumPego->Descr[i] = '\0';
	fseek (Arqui, 1, SEEK_CUR);

	fscanf (Arqui, "%d", &AlbumPego->NumerFotos);

	FechaArquivo (Arqui);
	return 0;
}

int AtualizaAlbum_PA (Album_PA* NovoAlbum)
{

	int i, ValorRegis;
	FILE *Arqui;

	Arqui = fopen (ARQUIVO_PA, "r+w");

	if (Arqui == NULL)
	{
		return -1;
	}

	ValorRegis = EncontraAlbum_PA (Arqui, NovoAlbum->CpfUser, NovoAlbum->Codig);
	if (ValorRegis == -1)
	{
		FechaArquivo (Arqui);
		return -2;
	}

	fseek (Arqui, ValorRegis * (TAMANHOREG_PA + 2), SEEK_SET);
	fprintf (Arqui, "%1d", NovoAlbum->Priva);
	fseek (Arqui, 1, SEEK_CUR);

	for (i = 0; i < 11; i++)
	{
		fprintf (Arqui, "%c", NovoAlbum->CpfUser[i]);
	}

	fseek (Arqui, 1, SEEK_CUR);

	for (i = 0; i < 10; i++)
	{
		fprintf (Arqui, "%c", NovoAlbum->Codig[i]);
	}

	fseek (Arqui, 1, SEEK_CUR);

	for (i = 0; i < 15; i++)
	{
		fprintf (Arqui, "%c", NovoAlbum->Nome[i]);
	}

	fseek (Arqui, 1, SEEK_CUR);

	for (i = 0; i < 30; i++)
	{
		fprintf (Arqui, "%c", NovoAlbum->Descr[i]);
	}

	fseek (Arqui, 1, SEEK_CUR);

	fprintf (Arqui, "%2d", NovoAlbum->NumerFotos);

	FechaArquivo (Arqui);
	return 0;
}

int DeletaAlbum_PA (const char* CpfPass, const char* CodigPass)
{
	FILE *ArquiTexto;
	int PosicRegis, ValidOpera, ErroSuces;
	char NomeArqui[] = NARQUIVO_PA;

	ArquiTexto = fopen (ARQUIVO_PA, "r+w");

	if (ArquiTexto == NULL)
	{
		return -1;
	}

	PosicRegis = EncontraAlbum_PA (ArquiTexto, CpfPass, CodigPass);

	if (PosicRegis == -1)
	{
		FechaArquivo (ArquiTexto);
		return -2;
	}

	fseek (ArquiTexto, (PosicRegis * (TAMANHOREG_PA + 2)), SEEK_SET);

	fprintf (ArquiTexto, "%c", VARIAVELCONTROLE_PA);
	fprintf (ArquiTexto, "%c", VARIAVELCONTROLE_PA);
	fprintf (ArquiTexto, "%c", VARIAVELCONTROLE_PA);

	FechaArquivo (ArquiTexto);

	ValidOpera = LiberaRegistro_VB (PosicRegis + 1, NomeArqui);
	ErroSuces = ValidaOperacao_PA (ValidOpera);

	return ErroSuces;
}

int AddAlbum_PA (Album_PA* NovoAlbum)
{
	char NomeArqui[] = NARQUIVO_PA;
	int i, NovaPosic, ValidOpera, ErroSuces;
	FILE *Arqui;

	Arqui = fopen (ARQUIVO_PA, "r+w");

	if (Arqui == NULL)
	{
		return -1;
	}
	NovaPosic = EncontraAlbum_PA (Arqui, NovoAlbum->CpfUser, NovoAlbum->Codig);
	if (NovaPosic >= 0)
	{
		FechaArquivo (Arqui);
		return -2;
	}

	NovaPosic = PreencheRegistro_VB (NomeArqui);

	if (NovaPosic < 0)
	{
		ErroSuces = ValidaOperacao_PA (NovaPosic);

		NovaPosic = PreencheRegistro_VB (NomeArqui);

		if (ErroSuces < 0)
		{
			FechaArquivo (Arqui);
			return ErroSuces;
		}

		if (NovaPosic < 0)
		{
			FechaArquivo (Arqui);
			return NovaPosic * 100;
		}
	}

	fseek (Arqui, ((NovaPosic - 1)*(TAMANHOREG_PA + 2)), SEEK_SET);

	fprintf (Arqui, "%1d", NovoAlbum->Priva);
	fprintf (Arqui, "|");

	for (i = 0; i < 11; i++)
	{
		fprintf (Arqui, "%c", NovoAlbum->CpfUser[i]);
	}

	fprintf (Arqui, "|");

	for (i = 0; i < 10; i++)
	{
		fprintf (Arqui, "%c", NovoAlbum->Codig[i]);
	}

	fprintf (Arqui, "|");

	for (i = 0; i < 15; i++)
	{
		fprintf (Arqui, "%c", NovoAlbum->Nome[i]);
	}

	fprintf (Arqui, "|");

	for (i = 0; i < 30; i++)
	{
		fprintf (Arqui, "%c", NovoAlbum->Descr[i]);
	}

	fprintf (Arqui, "|");

	fprintf (Arqui, "%2d", NovoAlbum->NumerFotos);

	fprintf (Arqui, "\n");

	FechaArquivo (Arqui);
	return 0;
}

int RetiraFoto_PA (const char* CpfPass, const char* CodigPass)
{
	int PosicRegis;
	FILE *ArquiTexto;
	int NumerFoto = 0;

	ArquiTexto = fopen (ARQUIVO_PA, "r+w");

	if (ArquiTexto == NULL)
	{
		return -1;
	}

	PosicRegis = EncontraAlbum_PA (ArquiTexto, CpfPass, CodigPass);
	if (PosicRegis == -1)
	{
		FechaArquivo (ArquiTexto);
		return -2;
	}

	fseek (ArquiTexto, (PosicRegis * (TAMANHOREG_PA + 2)) + 72, SEEK_SET);

	fscanf (ArquiTexto, "%2d", &NumerFoto);
	NumerFoto--;

	fseek (ArquiTexto, -2, SEEK_CUR);

	fprintf (ArquiTexto, "%2d", NumerFoto);

	FechaArquivo (ArquiTexto);
	return (NumerFoto);
}

int AddFoto_PA (const char* CpfPass, char* CodigPass)
{
	int PosicRegis;
	FILE *ArquiTexto;
	int NumerFoto = 0;

	ArquiTexto = fopen (ARQUIVO_PA, "r+w");

	if (ArquiTexto == NULL)
	{
		return -1;
	}

	PosicRegis = EncontraAlbum_PA (ArquiTexto, CpfPass, CodigPass);
	if (PosicRegis == -1)
	{
		FechaArquivo (ArquiTexto);
		return -2;
	}

	fseek (ArquiTexto, (PosicRegis * (TAMANHOREG_PA + 2)) + 72, SEEK_SET);

	fscanf (ArquiTexto, "%2d", &NumerFoto);
	NumerFoto++;

	fseek (ArquiTexto, -2, SEEK_CUR);

	fprintf (ArquiTexto, "%2d", NumerFoto);

	FechaArquivo (ArquiTexto);
	return (NumerFoto);
}

int NumeroFotosAlbum_PA (const char* CpfPass, const char* CodigPass)
{
	int PosicRegis;
	FILE *ArquiTexto;
	int NumerFoto = 0;

	ArquiTexto = fopen (ARQUIVO_PA, "r+w");

	if (ArquiTexto == NULL)
	{
		return -1;
	}

	PosicRegis = EncontraAlbum_PA (ArquiTexto, CpfPass, CodigPass);
	if (PosicRegis == -1)
	{
		return -2;
	}


	fseek (ArquiTexto, (PosicRegis * (TAMANHOREG_PA + 2)) + 72, SEEK_SET);

	fscanf (ArquiTexto, "%2d", &NumerFoto);

	FechaArquivo (ArquiTexto);
	return (NumerFoto);
}

int ListaPublicos_PA (Album_PA *AlbumPass, int Pulo)
{
	FILE *ArquiTexto;
	char Priva;
	int PosicAtual = 1, i = 0;

	ArquiTexto = fopen (ARQUIVO_PA, "r");

	if (ArquiTexto == NULL)
	{
		return -1;
	}

	fseek (ArquiTexto, Pulo * (TAMANHOREG_PA), SEEK_SET);

	fscanf (ArquiTexto, "%c", &Priva);
	while (!feof (ArquiTexto))
	{
		if (Priva == '0')
		{
			fseek (ArquiTexto, 1, SEEK_CUR);

			for (i = 0; i < 11; i++)
			{
				AlbumPass->CpfUser[i] = fgetc (ArquiTexto);
			}
			AlbumPass->CpfUser[i] = '\0';

			fseek (ArquiTexto, 1, SEEK_CUR);
			for (i = 0; i < 10; i++)
			{
				AlbumPass->Codig[i] = fgetc (ArquiTexto);
			}
			AlbumPass->Codig[i] = '\0';

			return PosicAtual;
		}

		PosicAtual++;

		fseek (ArquiTexto, 75, SEEK_CUR);
		fscanf (ArquiTexto, "%c", &Priva);
	}

	return -2;
}

int ListaAlbuns_PA (Album_PA *AlbumPass, int Pulo, const char* CpfPass)
{
	FILE *ArquiTexto = NULL;
	char Priva, Lixo;
	int PosicAtual = 1, i = 0;

	ArquiTexto = fopen (ARQUIVO_PA, "r");

	if (ArquiTexto == NULL)
	{
		return -1;
	}

	fseek (ArquiTexto, Pulo * (TAMANHOREG_PA+2), SEEK_SET);

	fscanf (ArquiTexto, "%c", &Lixo);

	while (!feof (ArquiTexto))
	{
		fseek (ArquiTexto, 1, SEEK_CUR);

		for (i = 0; i < 11; i++)
		{
			AlbumPass->CpfUser[i] = fgetc (ArquiTexto);
		}
		AlbumPass->CpfUser[i] = '\0';

		if (strcmp (AlbumPass->CpfUser, CpfPass) == 0)
		{
			fseek (ArquiTexto, 1, SEEK_CUR);
			for (i = 0; i < 10; i++)
			{
				AlbumPass->Codig[i] = fgetc (ArquiTexto);
			}
			AlbumPass->Codig[i] = '\0';

			return (PosicAtual+Pulo);
		}

		PosicAtual++;

		fseek (ArquiTexto, 63, SEEK_CUR);
		fscanf (ArquiTexto, "%c", &Lixo);
	}

	return -2;
}
